{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import io\n",
    "import os\n",
    "import platform\n",
    "import pdb\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from matplotlib.pyplot import cm\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "from sklearn import preprocessing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Temp (°C)</th>\n",
       "      <th>Dew Point Temp (°C)</th>\n",
       "      <th>Rel Hum (%)</th>\n",
       "      <th>Wind Dir (10s deg)</th>\n",
       "      <th>Wind Spd (km/h)</th>\n",
       "      <th>Stn Press (kPa)</th>\n",
       "      <th>SO2</th>\n",
       "      <th>NO</th>\n",
       "      <th>NO2</th>\n",
       "      <th>NOx</th>\n",
       "      <th>CO</th>\n",
       "      <th>O3</th>\n",
       "      <th>PM25</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>-3.5</td>\n",
       "      <td>-8.0</td>\n",
       "      <td>71.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>100.09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.16</td>\n",
       "      <td>30.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>-4.5</td>\n",
       "      <td>-9.2</td>\n",
       "      <td>70.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>100.23</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.16</td>\n",
       "      <td>32.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>-5.4</td>\n",
       "      <td>-7.7</td>\n",
       "      <td>84.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>100.37</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.16</td>\n",
       "      <td>35.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>-5.4</td>\n",
       "      <td>-11.0</td>\n",
       "      <td>65.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>100.49</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.16</td>\n",
       "      <td>34.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99</th>\n",
       "      <td>-6.7</td>\n",
       "      <td>-10.8</td>\n",
       "      <td>73.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>100.67</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.16</td>\n",
       "      <td>35.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100</th>\n",
       "      <td>-7.8</td>\n",
       "      <td>-13.1</td>\n",
       "      <td>66.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>100.78</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.16</td>\n",
       "      <td>36.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>101</th>\n",
       "      <td>-8.6</td>\n",
       "      <td>-15.3</td>\n",
       "      <td>58.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>100.88</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.16</td>\n",
       "      <td>35.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>102</th>\n",
       "      <td>-9.4</td>\n",
       "      <td>-14.8</td>\n",
       "      <td>65.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>100.97</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.16</td>\n",
       "      <td>34.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>103</th>\n",
       "      <td>-10.5</td>\n",
       "      <td>-16.4</td>\n",
       "      <td>62.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>101.09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.17</td>\n",
       "      <td>33.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>104</th>\n",
       "      <td>-11.2</td>\n",
       "      <td>-17.8</td>\n",
       "      <td>59.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>101.25</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>0.19</td>\n",
       "      <td>33.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>105</th>\n",
       "      <td>-11.1</td>\n",
       "      <td>-17.5</td>\n",
       "      <td>59.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>17.0</td>\n",
       "      <td>101.37</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.18</td>\n",
       "      <td>32.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>106</th>\n",
       "      <td>-11.1</td>\n",
       "      <td>-16.8</td>\n",
       "      <td>63.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>101.47</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>0.18</td>\n",
       "      <td>33.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>107</th>\n",
       "      <td>-10.6</td>\n",
       "      <td>-17.4</td>\n",
       "      <td>58.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>101.53</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.22</td>\n",
       "      <td>33.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>108</th>\n",
       "      <td>-11.0</td>\n",
       "      <td>-18.3</td>\n",
       "      <td>55.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>101.54</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>0.19</td>\n",
       "      <td>33.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>109</th>\n",
       "      <td>-10.9</td>\n",
       "      <td>-17.7</td>\n",
       "      <td>57.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>101.50</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>0.20</td>\n",
       "      <td>33.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Temp (°C)  Dew Point Temp (°C)  Rel Hum (%)  Wind Dir (10s deg)  \\\n",
       "95        -3.5                 -8.0         71.0                29.0   \n",
       "96        -4.5                 -9.2         70.0                28.0   \n",
       "97        -5.4                 -7.7         84.0                26.0   \n",
       "98        -5.4                -11.0         65.0                27.0   \n",
       "99        -6.7                -10.8         73.0                26.0   \n",
       "100       -7.8                -13.1         66.0                27.0   \n",
       "101       -8.6                -15.3         58.0                27.0   \n",
       "102       -9.4                -14.8         65.0                27.0   \n",
       "103      -10.5                -16.4         62.0                27.0   \n",
       "104      -11.2                -17.8         59.0                26.0   \n",
       "105      -11.1                -17.5         59.0                27.0   \n",
       "106      -11.1                -16.8         63.0                26.0   \n",
       "107      -10.6                -17.4         58.0                27.0   \n",
       "108      -11.0                -18.3         55.0                26.0   \n",
       "109      -10.9                -17.7         57.0                27.0   \n",
       "\n",
       "     Wind Spd (km/h)  Stn Press (kPa)  SO2   NO  NO2  NOx    CO    O3  PM25  \n",
       "95              19.0           100.09  0.0  0.0  4.0  4.0  0.16  30.0   3.0  \n",
       "96              19.0           100.23  0.0  0.0  4.0  4.0  0.16  32.0   3.0  \n",
       "97              19.0           100.37  0.0  0.0  3.0  3.0  0.16  35.0   3.0  \n",
       "98              20.0           100.49  0.0  0.0  3.0  3.0  0.16  34.0   3.0  \n",
       "99              22.0           100.67  0.0  0.0  3.0  3.0  0.16  35.0   4.0  \n",
       "100             25.0           100.78  0.0  0.0  3.0  3.0  0.16  36.0   4.0  \n",
       "101             26.0           100.88  0.0  0.0  4.0  4.0  0.16  35.0   5.0  \n",
       "102             27.0           100.97  0.0  0.0  5.0  5.0  0.16  34.0   4.0  \n",
       "103             21.0           101.09  0.0  1.0  6.0  7.0  0.17  33.0   4.0  \n",
       "104             22.0           101.25  0.0  1.0  6.0  8.0  0.19  33.0   4.0  \n",
       "105             17.0           101.37  0.0  2.0  7.0  9.0  0.18  32.0   4.0  \n",
       "106             19.0           101.47  0.0  2.0  6.0  8.0  0.18  33.0   3.0  \n",
       "107             21.0           101.53  0.0  2.0  5.0  7.0  0.22  33.0   3.0  \n",
       "108             23.0           101.54  0.0  2.0  5.0  8.0  0.19  33.0   4.0  \n",
       "109             20.0           101.50  0.0  2.0  6.0  8.0  0.20  33.0   4.0  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data=pd.read_csv('./Hamilton.csv')\n",
    "data.replace(9999,np.nan,inplace=True)\n",
    "data.replace(-999,np.nan,inplace=True)\n",
    "# data.fillna(np.mean(data),inplace=True)\n",
    "data[95:110]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(len(data)):\n",
    "    for j in range(len(data.columns)):\n",
    "        if np.isnan(data.iat[i,j]):\n",
    "            if i==0:\n",
    "                data.iloc[i,j]=data.iat[i+1,j]\n",
    "            elif i==len(data)-1:\n",
    "                data.iloc[i,j]=data.iat[i-1,j]\n",
    "            else:\n",
    "                data.iloc[i,j]=np.nanmean([data.iat[i-1,j],data.iat[i+1,j]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Temp (°C)</th>\n",
       "      <th>Dew Point Temp (°C)</th>\n",
       "      <th>Rel Hum (%)</th>\n",
       "      <th>Wind Dir (10s deg)</th>\n",
       "      <th>Wind Spd (km/h)</th>\n",
       "      <th>Stn Press (kPa)</th>\n",
       "      <th>SO2</th>\n",
       "      <th>NO</th>\n",
       "      <th>NO2</th>\n",
       "      <th>NOx</th>\n",
       "      <th>CO</th>\n",
       "      <th>O3</th>\n",
       "      <th>PM25</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-7.4</td>\n",
       "      <td>-15.4</td>\n",
       "      <td>53.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>100.35</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>0.16</td>\n",
       "      <td>25.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-7.3</td>\n",
       "      <td>-15.3</td>\n",
       "      <td>53.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>100.26</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.17</td>\n",
       "      <td>26.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-7.1</td>\n",
       "      <td>-14.6</td>\n",
       "      <td>55.0</td>\n",
       "      <td>24.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>100.24</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.17</td>\n",
       "      <td>24.0</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-6.8</td>\n",
       "      <td>-13.7</td>\n",
       "      <td>58.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>100.25</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.18</td>\n",
       "      <td>23.0</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-6.5</td>\n",
       "      <td>-13.0</td>\n",
       "      <td>60.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>100.22</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.18</td>\n",
       "      <td>23.0</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Temp (°C)  Dew Point Temp (°C)  Rel Hum (%)  Wind Dir (10s deg)  \\\n",
       "0       -7.4                -15.4         53.0                26.0   \n",
       "1       -7.3                -15.3         53.0                25.0   \n",
       "2       -7.1                -14.6         55.0                24.0   \n",
       "3       -6.8                -13.7         58.0                25.0   \n",
       "4       -6.5                -13.0         60.0                25.0   \n",
       "\n",
       "   Wind Spd (km/h)  Stn Press (kPa)  SO2   NO  NO2  NOx    CO    O3  PM25  \n",
       "0             16.0           100.35  0.0  1.0  7.0  8.0  0.16  25.0   6.0  \n",
       "1             12.0           100.26  0.0  1.0  6.0  7.0  0.17  26.0   6.0  \n",
       "2             15.0           100.24  0.0  1.0  6.0  6.0  0.17  24.0   7.0  \n",
       "3             15.0           100.25  0.0  1.0  5.0  6.0  0.18  23.0   7.0  \n",
       "4             13.0           100.22  0.0  1.0  6.0  7.0  0.18  23.0   7.0  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset=pd.DataFrame(data,columns=data.columns[:])\n",
    "scaler = preprocessing.MinMaxScaler() \n",
    "scaled_values = scaler.fit_transform(dataset) \n",
    "dataset.loc[:,:] = scaled_values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Temp (°C)</th>\n",
       "      <th>Dew Point Temp (°C)</th>\n",
       "      <th>Rel Hum (%)</th>\n",
       "      <th>Wind Dir (10s deg)</th>\n",
       "      <th>Wind Spd (km/h)</th>\n",
       "      <th>Stn Press (kPa)</th>\n",
       "      <th>SO2</th>\n",
       "      <th>NO</th>\n",
       "      <th>NO2</th>\n",
       "      <th>NOx</th>\n",
       "      <th>CO</th>\n",
       "      <th>O3</th>\n",
       "      <th>PM25</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.317666</td>\n",
       "      <td>0.285974</td>\n",
       "      <td>0.447059</td>\n",
       "      <td>0.722222</td>\n",
       "      <td>0.50000</td>\n",
       "      <td>0.530756</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.003802</td>\n",
       "      <td>0.103448</td>\n",
       "      <td>0.022508</td>\n",
       "      <td>0.115942</td>\n",
       "      <td>0.320513</td>\n",
       "      <td>0.090909</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.319287</td>\n",
       "      <td>0.287796</td>\n",
       "      <td>0.447059</td>\n",
       "      <td>0.694444</td>\n",
       "      <td>0.37500</td>\n",
       "      <td>0.514938</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.003802</td>\n",
       "      <td>0.086207</td>\n",
       "      <td>0.019293</td>\n",
       "      <td>0.123188</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>0.090909</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.322528</td>\n",
       "      <td>0.300546</td>\n",
       "      <td>0.470588</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.46875</td>\n",
       "      <td>0.511424</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.003802</td>\n",
       "      <td>0.086207</td>\n",
       "      <td>0.016077</td>\n",
       "      <td>0.123188</td>\n",
       "      <td>0.307692</td>\n",
       "      <td>0.106061</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.327391</td>\n",
       "      <td>0.316940</td>\n",
       "      <td>0.505882</td>\n",
       "      <td>0.694444</td>\n",
       "      <td>0.46875</td>\n",
       "      <td>0.513181</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.003802</td>\n",
       "      <td>0.068966</td>\n",
       "      <td>0.016077</td>\n",
       "      <td>0.130435</td>\n",
       "      <td>0.294872</td>\n",
       "      <td>0.106061</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.332253</td>\n",
       "      <td>0.329690</td>\n",
       "      <td>0.529412</td>\n",
       "      <td>0.694444</td>\n",
       "      <td>0.40625</td>\n",
       "      <td>0.507909</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.003802</td>\n",
       "      <td>0.086207</td>\n",
       "      <td>0.019293</td>\n",
       "      <td>0.130435</td>\n",
       "      <td>0.294872</td>\n",
       "      <td>0.106061</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Temp (°C)  Dew Point Temp (°C)  Rel Hum (%)  Wind Dir (10s deg)  \\\n",
       "0   0.317666             0.285974     0.447059            0.722222   \n",
       "1   0.319287             0.287796     0.447059            0.694444   \n",
       "2   0.322528             0.300546     0.470588            0.666667   \n",
       "3   0.327391             0.316940     0.505882            0.694444   \n",
       "4   0.332253             0.329690     0.529412            0.694444   \n",
       "\n",
       "   Wind Spd (km/h)  Stn Press (kPa)  SO2        NO       NO2       NOx  \\\n",
       "0          0.50000         0.530756  0.0  0.003802  0.103448  0.022508   \n",
       "1          0.37500         0.514938  0.0  0.003802  0.086207  0.019293   \n",
       "2          0.46875         0.511424  0.0  0.003802  0.086207  0.016077   \n",
       "3          0.46875         0.513181  0.0  0.003802  0.068966  0.016077   \n",
       "4          0.40625         0.507909  0.0  0.003802  0.086207  0.019293   \n",
       "\n",
       "         CO        O3      PM25  \n",
       "0  0.115942  0.320513  0.090909  \n",
       "1  0.123188  0.333333  0.090909  \n",
       "2  0.123188  0.307692  0.106061  \n",
       "3  0.130435  0.294872  0.106061  \n",
       "4  0.130435  0.294872  0.106061  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_set=np.asarray(dataset,dtype=np.float32)\n",
    "seq_len=30 + 1\n",
    "x=len(data_set)-seq_len\n",
    "sequences = [data_set[t:t+seq_len] for t in range(x)]\n",
    "seq=torch.FloatTensor(sequences)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([17513, 31, 13])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "seq.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "split_row=round(0.90*seq.size(0))\n",
    "x_train_set=seq[:split_row, :-1]\n",
    "y_train_set=seq[:split_row, -1]\n",
    "x_valid_set=seq[split_row:, :-1]\n",
    "y_valid_set=seq[split_row:, -1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1751, 30, 13])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_valid_set.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "class LSTM(nn.Module):\n",
    "    def __init__(self,input_size,hidden_size,num_layers=1,dropout=0,bidirectional=False):\n",
    "        super(LSTM,self).__init__()\n",
    "        self.input_size=input_size\n",
    "        self.hidden_size=hidden_size\n",
    "        self.num_layers=num_layers\n",
    "        self.dropout=dropout\n",
    "        self.bidirectional=bidirectional\n",
    "        self.lstm = nn.LSTM(input_size,\n",
    "                            hidden_size,\n",
    "                            num_layers,\n",
    "                            dropout=dropout,\n",
    "                            bidirectional=bidirectional)\n",
    "        self.linear = nn.Linear(hidden_size, 13)\n",
    "        \n",
    "    def forward(self,inputs,hidden):\n",
    "        outputs,hidden=self.lstm(inputs,hidden)\n",
    "        predictions=self.linear(outputs[-1])\n",
    "        return predictions,outputs,hidden\n",
    "    \n",
    "    def init_hidden(self,batch_size):\n",
    "        num_directions=2 if self.bidirectional else 1\n",
    "        hidden = (torch.zeros(self.num_layers*num_directions, batch_size, self.hidden_size),\n",
    "                  torch.zeros(self.num_layers*num_directions, batch_size, self.hidden_size))\n",
    "        return hidden"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_batch(x,y,i,batch_size):\n",
    "    if x.dim() == 2:\n",
    "        x = x.unsqueeze(2)\n",
    "    batch_x = x[(i*batch_size):(i*batch_size)+batch_size, :, :]\n",
    "    batch_y = y[(i*batch_size):(i*batch_size)+batch_size]\n",
    "\n",
    "    # Reshape Tensors into (seq_len, batch_size, input_size) format for the LSTM.\n",
    "    batch_x = batch_x.transpose(0, 1)\n",
    "    \n",
    "    return batch_x, batch_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(model,x_train_set,y_train_set,optimizer,batch_size,epoch):\n",
    "    num_sequences=x_train_set.size(0)\n",
    "    num_batches=num_sequences//batch_size\n",
    "    \n",
    "    total_loss=0\n",
    "    \n",
    "    model.train()\n",
    "    for i in range(num_batches):\n",
    "        # Get input and target batches and reshape for LSTM.\n",
    "        batch_x, batch_y = get_batch(x_train_set, y_train_set, i, batch_size)\n",
    "\n",
    "        # Reset the gradient.\n",
    "        lstm.zero_grad()\n",
    "        \n",
    "        # Initialize the hidden states (see the function lstm.init_hidden(batch_size)).\n",
    "        hidden = lstm.init_hidden(batch_size)\n",
    "        \n",
    "        # Complete a forward pass.\n",
    "        y_pred, outputs, hidden = lstm(batch_x,hidden)\n",
    "        \n",
    "        # Calculate the loss with the 'loss_fn'.\n",
    "        loss = loss_fn(y_pred,batch_y)\n",
    "        \n",
    "        # Compute the gradient.\n",
    "        loss.backward()\n",
    "        \n",
    "        # Clip to the gradient to avoid exploding gradient.\n",
    "        nn.utils.clip_grad_norm_(lstm.parameters(), max_grad_norm)\n",
    "\n",
    "        # Make one step with optimizer.\n",
    "        optimizer.step()\n",
    "        \n",
    "        # Accumulate the total loss.\n",
    "        total_loss += loss.data\n",
    "        \n",
    "    print(\"Epoch {}: Loss = {:.8f}\".format(epoch+1, total_loss/num_batches))\n",
    "    return total_loss/num_batches,y_pred[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def eval(model,x_valid_set,y_valid_set,optimizer,batch_size):\n",
    "    num_sequences=x_valid_set.size(0)\n",
    "    num_batches=num_sequences//batch_size\n",
    "    \n",
    "    total_loss=0\n",
    "    \n",
    "    model.eval()\n",
    "    for i in range(num_batches):\n",
    "        # Get input and target batches and reshape for LSTM.\n",
    "        batch_x, batch_y = get_batch(x_valid_set, y_valid_set, i, batch_size)\n",
    "\n",
    "        # Reset the gradient.\n",
    "        lstm.zero_grad()\n",
    "        \n",
    "        # Initialize the hidden states (see the function lstm.init_hidden(batch_size)).\n",
    "        hidden = lstm.init_hidden(batch_size)\n",
    "        \n",
    "        # Complete a forward pass.\n",
    "        y_pred, outputs, hidden = lstm(batch_x,hidden)\n",
    "        \n",
    "        # Calculate the loss with the 'loss_fn'.\n",
    "        loss = loss_fn(y_pred,batch_y)\n",
    "        \n",
    "        # Compute the gradient.\n",
    "        loss.backward()\n",
    "        \n",
    "        # Clip to the gradient to avoid exploding gradient.\n",
    "        nn.utils.clip_grad_norm_(lstm.parameters(), max_grad_norm)\n",
    "\n",
    "        # Make one step with optimizer.\n",
    "        optimizer.step()\n",
    "        \n",
    "        # Accumulate the total loss.\n",
    "        total_loss += loss.data\n",
    "\n",
    "    print(\"Validation: Loss = {:.8f}\".format(total_loss/num_batches))\n",
    "    return total_loss/num_batches,y_pred[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def save_model(epoch, model, path='./'):\n",
    "    \n",
    "    # file name and path \n",
    "    filename = path + 'neural_network_{}.pt'.format(epoch)\n",
    "    \n",
    "    # load the model parameters \n",
    "    torch.save(model.state_dict(), filename)\n",
    "    \n",
    "    \n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_model(epoch, model, path='./'):\n",
    "    \n",
    "    # file name and path \n",
    "    filename = path + 'neural_network_{}.pt'.format(epoch)\n",
    "    \n",
    "    # load the model parameters \n",
    "    model.load_state_dict(torch.load(filename))\n",
    "    \n",
    "    \n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model for 30 epoch\n",
      "Epoch 1: Loss = 0.01681050\n",
      "Validation: Loss = 0.00774342\n",
      "Epoch 2: Loss = 0.00736943\n",
      "Validation: Loss = 0.00549426\n",
      "Epoch 3: Loss = 0.00627372\n",
      "Validation: Loss = 0.00507773\n",
      "Epoch 4: Loss = 0.00587789\n",
      "Validation: Loss = 0.00479409\n",
      "Epoch 5: Loss = 0.00562017\n",
      "Validation: Loss = 0.00460763\n",
      "Epoch 6: Loss = 0.00544693\n",
      "Validation: Loss = 0.00447443\n",
      "Epoch 7: Loss = 0.00531273\n",
      "Validation: Loss = 0.00436567\n",
      "Epoch 8: Loss = 0.00520639\n",
      "Validation: Loss = 0.00427955\n",
      "Epoch 9: Loss = 0.00512377\n",
      "Validation: Loss = 0.00420370\n",
      "Epoch 10: Loss = 0.00505533\n",
      "Validation: Loss = 0.00413320\n",
      "Epoch 11: Loss = 0.00499984\n",
      "Validation: Loss = 0.00408063\n",
      "Epoch 12: Loss = 0.00495848\n",
      "Validation: Loss = 0.00404487\n",
      "Epoch 13: Loss = 0.00492583\n",
      "Validation: Loss = 0.00401902\n",
      "Epoch 14: Loss = 0.00489955\n",
      "Validation: Loss = 0.00399891\n",
      "Epoch 15: Loss = 0.00488005\n",
      "Validation: Loss = 0.00398310\n",
      "Epoch 16: Loss = 0.00486360\n",
      "Validation: Loss = 0.00397073\n",
      "Epoch 17: Loss = 0.00484937\n",
      "Validation: Loss = 0.00395963\n",
      "Epoch 18: Loss = 0.00483718\n",
      "Validation: Loss = 0.00394895\n",
      "Epoch 19: Loss = 0.00482645\n",
      "Validation: Loss = 0.00394106\n",
      "Epoch 20: Loss = 0.00481713\n",
      "Validation: Loss = 0.00393333\n",
      "Epoch 21: Loss = 0.00480967\n",
      "Validation: Loss = 0.00392854\n",
      "Epoch 22: Loss = 0.00480243\n",
      "Validation: Loss = 0.00392186\n",
      "Epoch 23: Loss = 0.00479609\n",
      "Validation: Loss = 0.00391620\n",
      "Epoch 24: Loss = 0.00479001\n",
      "Validation: Loss = 0.00391034\n",
      "Epoch 25: Loss = 0.00478323\n",
      "Validation: Loss = 0.00390433\n",
      "Epoch 26: Loss = 0.00477652\n",
      "Validation: Loss = 0.00389771\n",
      "Epoch 27: Loss = 0.00476933\n",
      "Validation: Loss = 0.00389085\n",
      "Epoch 28: Loss = 0.00476035\n",
      "Validation: Loss = 0.00388315\n",
      "Epoch 29: Loss = 0.00475224\n",
      "Validation: Loss = 0.00387465\n",
      "Epoch 30: Loss = 0.00474220\n",
      "Validation: Loss = 0.00386541\n",
      "\n",
      "\n",
      "\n",
      "Optimization ended.\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "input_size=13\n",
    "hidden_size=24\n",
    "num_layers=2\n",
    "lstm=LSTM(input_size,hidden_size,num_layers)\n",
    "\n",
    "learning_rate=0.001\n",
    "max_grad_norm=5\n",
    "loss_fn = nn.MSELoss()\n",
    "optimizer = optim.Adam(lstm.parameters(), lr=learning_rate,weight_decay=0.00001)\n",
    "\n",
    "batch_size = 8\n",
    "num_epochs = 30 #3\n",
    "# num_sequences = x_train_set.size(0)\n",
    "# num_batches = num_sequences //batch_size\n",
    "\n",
    "checkpoint_freq = 10\n",
    "path = './'\n",
    "\n",
    "train_losses=[]\n",
    "valid_losses=[]\n",
    "\n",
    "print(\"Training model for {} epoch\".format(num_epochs))\n",
    "for epoch in range(num_epochs):\n",
    "#     total_loss = 0\n",
    "\n",
    "    # Shuffle input and target sequences.\n",
    "    idx = torch.randperm(x_train_set.size(0))\n",
    "    x = x_train_set[idx]\n",
    "    y = y_train_set[idx]\n",
    "    \n",
    "    train_loss,train_pm25=train(lstm,x_train_set,y_train_set,optimizer,batch_size,epoch)\n",
    "    valid_loss,valid_pm25=eval(lstm,x_valid_set,y_valid_set,optimizer,batch_size)\n",
    "    \n",
    "    train_losses.append(train_loss)\n",
    "    valid_losses.append(valid_loss)\n",
    "    \n",
    "    # Checkpoint\n",
    "    if epoch % checkpoint_freq ==0:\n",
    "        save_model(epoch, lstm, path)\n",
    "        \n",
    "# Last checkpoint\n",
    "save_model(num_epochs, lstm, path)\n",
    "    \n",
    "print(\"\\n\\n\\nOptimization ended.\\n\")\n",
    "\n",
    "plt.plot(train_losses, color=\"darkcyan\", label=\"train\")\n",
    "plt.plot(valid_losses, color=\"tomato\",label=\"validation\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict_one_hour(model,x_valid_set,input_size,num_steps):\n",
    "    predictions=torch.zeros(num_steps)\n",
    "    for i, x in enumerate(x_valid_set):\n",
    "        hidden=model.init_hidden(1)\n",
    "        y_pred,_,_=model(x.contiguous().view(-1, 1, input_size),hidden)\n",
    "        predictions[i]=y_pred[:,-1]\n",
    "    return predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "one_step_predictions = predict_one_hour(lstm, x_valid_set, input_size, y_valid_set.size(0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(y_valid_set[:,-1].data.numpy(),color='darkcyan')\n",
    "plt.plot(one_step_predictions.data.numpy(),color='tomato')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
